/*
* 包含n个reducer函数 : 根据老的state 和 指定的action返回一个新的state
* */


import {combineReducers} from 'redux'


import {
    AUTH_SUCCESS,
    ERROR_MSG,
    RECEIVE_USER,
    RESET_USER,
    RECEIVE_USER_LIST,
    RECEIVE_MSG_LIST,
    RECEIVE_MSG,
    MSG_READ
} from './action-types'


import {getRedirectTo} from '../utils'


const initUser = {
    username: '',   // 用户名
    type: '',       // 用户类型   banwei/xueyuan
    msg: '',        // 用来存放错误提示信息
    redirectTo: '', // 需要自动重定向的路由路径
}

// 产生user状态的reducer
function user(state=initUser, action){
    // console.log(action.data)
    switch (action.type) {
        case AUTH_SUCCESS:  // data 是 user

            const {type, header} = action.data
            console.log(type)

            /* 注意传递参数的时候  顺序不要写错  */
            return {...action.data, redirectTo:getRedirectTo(type, header)}
        case ERROR_MSG:     // data 是 msg
            return {...state, msg: action.data}
        case RECEIVE_USER:     // data 是 user
            return action.data
        case RESET_USER:     // data 是 msg
            return {...initUser, msg: action.data}
        default:
            return state
    }
}




const initUserList = []
// 管理用户列表 userlist 的reducer
function userList(state=initUserList, action) {
   switch (action.type) {
       case RECEIVE_USER_LIST:   // data为userList
           return action.data
       default:
           return state
   } 
}


const initChat = {
    users: {},      // 所有用户信息的对象    属性名:userid,  属性值: {username, header}
    chatMsgs: [],    // 当前用户所有相关msg的数组
    unReadCount: 0      // 总的未读数量
}
// 产生聊天状态的reducer
function chat(state=initChat, action) {
    switch (action.type) {
        case RECEIVE_MSG_LIST:   // data: {users, chatMsgs}

            const {users, chatMsgs, userid} = action.data

            return {
                users,
                chatMsgs,
                unReadCount: chatMsgs.reduce((preTotal, msg) =>
                    preTotal + (!msg.read&&msg.to===userid?1:0),0)
            }
        case RECEIVE_MSG:  // 返回的 data: chatMsg
            // debugger
            const {chatMsg} = action.data
            // const {userId} = action.data
            // console.log(chatMsg)
            return {
                users: state.users,  // 以前的user
                chatMsgs: [...state.chatMsgs, chatMsg],     // 拆解出数组中原来的元素,然后在后面加一个元素
                unReadCount: state.unReadCount +
                    (!chatMsg.read&&chatMsg.to===action.data.userid?1:0)
            }
        case MSG_READ:  // 读取消息
            const {from, to, count} = action.data

            /*state.chatMsgs.forEach(msg => {
                if (msg.from===from && msg.to===to && !msg.read) {
                    msg.read=true
                }
            })*/

            /*
            * map()  方法不会改变以前的数据  但是会产生新的
            * */
            return {
                users: state.users,  // 以前的user
                chatMsgs: state.chatMsgs.map(msg => {
                    if (msg.from===from && msg.to===to && !msg.read) {  // 需要更新的
                        /* 没有去修改以前的msg,但是产生的新的msg已经改成true了 */
                        return {...msg, read:true}
                    } else { // 不需要更新的
                        return msg
                    }
                }),
                unReadCount: state.unReadCount - count
            }
        default:
            return state
    }
}



export default combineReducers({
    user,
    userList,
    chat
})

// 向外暴露的状态的结构:  { user:{}, userList:[], chat:{} }

